/* Operaciones entre vectores */

#include "vector.h"

double normaDos(Vector& A, int n)
{
	double res = 0;
	
	forn(i, n)
		res += fabs(A[i]);	
	
	res = sqrt(res);
	
	return res;
}

void resta(Vector& v1, Vector& v2, int n)
{
	forn(i, n)
		v1[i] = v1[i] - v2[i];		
		
	return;
}

void alphaVector(Vector& v, double alpha, int n)
{
	forn(i, n)
		v[i] = alpha * v[i];
		
	return;
}

void normalizar(Vector& v, int n)
{
	double norma = normaDos(v, n);
	
	if (norma <= 1e-6)
		norma = 1;
	
	alphaVector(v, 1.0/norma, n);
		
	return;		
}

double productoInterno(Vector& v1, Vector& v2, int n)
{
	double res = 0;
	
	forn(i, n)	
		res += v1[i]*v2[i];
	
	return res;
}

void proyeccion(Vector& v, Vector& u, Vector& res, int n)
{
	res = u;
	double prodIn1 = productoInterno(v, u, n);
	double prodIn2 = productoInterno(u, u, n);
	
	if (prodIn2 > 1e-6 ) 
	{
		alphaVector(res, prodIn1/prodIn2, n);
	}else
	{
		alphaVector(res, prodIn1, n);	
	}	
	
	return;
}

void swap(Vector& v, int i, int j)
{
	double aux = v[i];
	v[i] = v[j];
	v[j] = aux;
	return;
}

inline double random (double start, double end)
{
    return start+(end-start)*rand()/(RAND_MAX + 1.0);
}

void generarVector(Vector& v, int n)
{
	forn(i, n)
		v[i] = random(-MAX, MAX);
	
	return;
}
